package com.gitee.zhziyun.cnfsystem.utils.FileUtil;

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.regex.*;

/**
 * 文件拼接工具类，用于将多个临时文件按顺序拼接成完整文件
 * 主要用于多线程文件传输后的文件重组
 */
public class FileConcatenator {

    /**
     * 拼接目录下所有 {n}.tmp 文件
     * 
     * @param sourceDir 源目录路径，包含需要拼接的临时文件
     * @param outputFile 输出文件路径，拼接后生成的完整文件
     * @throws IOException 如果发生IO错误或无法访问文件
     */
    public static void concatenateTempFiles(String sourceDir, String outputFile) throws IOException {
        // 获取目录下所有符合 {n}.tmp 模式的文件
        List<Path> tempFiles = getSortedTempFiles(sourceDir);

        try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(Paths.get(outputFile)))) {
            for (Path file : tempFiles) {
                Files.copy(file, out); // 自动追加写入
                System.out.println("已拼接: " + file.getFileName());
            }
        } catch (IOException e) {
            throw new IOException("文件拼接过程中发生错误: " + e.getMessage(), e);
        }
        System.out.println("拼接完成，输出文件: " + outputFile);
    }

    /**
     * 获取排序后的 .tmp 文件列表（按数字升序）
     * 
     * @param dir 包含临时文件的目录路径
     * @return 按数字升序排列的.tmp文件列表
     * @throws IOException 如果无法读取目录内容
     */
    private static List<Path> getSortedTempFiles(String dir) throws IOException {
        Pattern pattern = Pattern.compile("^(\\d+)\\.tmp$"); // 匹配 {n}.tmp
        List<Path> files = new ArrayList<>();

        try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir), "*.tmp")) {
            for (Path file : stream) {
                Matcher matcher = pattern.matcher(file.getFileName().toString());
                if (matcher.matches()) {
                    files.add(file);
                }
            }
        }

        // 按数字部分升序排序
        files.sort(Comparator.comparingInt(p ->
                Integer.parseInt(
                        p.getFileName().toString().replace(".tmp", "")
                )
        ));

        return files;
    }

    public static void main(String[] args) {
        try {
            concatenateTempFiles("/path/to/source", "/path/to/output/merged.dat");
        } catch (IOException e) {
            System.err.println("错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}